package fairygui.editor.gui
{
   import fairygui.utils.GTimers;
   
   public class EGGroup extends EGObject
   {
      
      public static const HORIZONTAL:String = "hz";
      
      public static const VERTICAL:String = "vt";
       
      
      private var _empty:Boolean;
      
      private var _advanced:Boolean;
      
      private var _layout:String;
      
      private var _lineGap:int;
      
      private var _columnGap:int;
      
      private var _boundsChanged:Boolean;
      
      private var _percentReady:Boolean;
      
      public var opened:Boolean;
      
      public var needUpdate:Boolean;
      
      public var updating:int;
      
      public var displayCollapsed:Boolean;
      
      public function EGGroup()
      {
         super();
         this.objectType = ObjectTypes.GROUP;
         _useSourceSize = false;
         this._layout = "none";
      }
      
      public function get advanced() : Boolean
      {
         return this._advanced;
      }
      
      public function set advanced(param1:Boolean) : void
      {
         if(this._advanced != param1)
         {
            this._advanced = param1;
            this._percentReady = false;
            this.updateImmdediately(true);
            if(!this._advanced)
            {
               _internalVisible = true;
               if(parent)
               {
                  parent.updateDisplayList();
               }
            }
            else
            {
               checkGearDisplay();
            }
         }
      }
      
      public function get layout() : String
      {
         return this._layout;
      }
      
      public function set layout(param1:String) : void
      {
         var _loc2_:int = 0;
         var _loc3_:int = 0;
         var _loc4_:EGObject = null;
         var _loc5_:EGObject = null;
         if(this._layout != param1)
         {
            this._layout = param1;
            this._percentReady = false;
            if(this._layout == "hz")
            {
               if(this._columnGap == 0)
               {
                  _loc2_ = parent.numChildren;
                  _loc3_ = 0;
                  while(_loc3_ < _loc2_)
                  {
                     _loc4_ = parent.getChildAt(_loc3_);
                     if(_loc4_._group == this)
                     {
                        if(!_loc5_)
                        {
                           _loc5_ = _loc4_;
                        }
                        else
                        {
                           setProperty("columnGap",int(_loc4_.x - _loc5_.x - _loc5_.width));
                           break;
                        }
                     }
                     _loc3_++;
                  }
               }
            }
            else if(this._layout == "vt")
            {
               if(this._lineGap == 0)
               {
                  _loc2_ = parent.numChildren;
                  _loc3_ = 0;
                  while(_loc3_ < _loc2_)
                  {
                     _loc4_ = parent.getChildAt(_loc3_);
                     if(_loc4_._group == this)
                     {
                        if(!_loc5_)
                        {
                           _loc5_ = _loc4_;
                        }
                        else
                        {
                           setProperty("lineGap",int(_loc4_.y - _loc5_.y - _loc5_.height));
                           break;
                        }
                     }
                     _loc3_++;
                  }
               }
            }
            this.updateImmdediately(true);
         }
      }
      
      public function get lineGap() : int
      {
         return this._lineGap;
      }
      
      public function set lineGap(param1:int) : void
      {
         if(this._lineGap != param1)
         {
            this._lineGap = param1;
            this.update();
         }
      }
      
      public function get columnGap() : int
      {
         return this._columnGap;
      }
      
      public function set columnGap(param1:int) : void
      {
         if(this._columnGap != param1)
         {
            this._columnGap = param1;
            this.update();
         }
      }
      
      public function update(param1:Boolean = false) : void
      {
         if(this.updating != 0 || !parent || !this._advanced && EUIObjectFactory.constructingDepth != 0 || this._advanced && this.underConstruct)
         {
            return;
         }
         if(param1)
         {
            this._percentReady = false;
         }
         if(!this.needUpdate)
         {
            this.needUpdate = true;
            if(!this.opened)
            {
               GTimers.inst.callLater(this.updateImmdediately);
            }
         }
      }
      
      private function updatePercent() : void
      {
         var _loc2_:int = 0;
         var _loc3_:EGObject = null;
         this._percentReady = true;
         var _loc1_:int = parent.numChildren;
         var _loc4_:Number = 0;
         if(this._layout == "hz")
         {
            _loc2_ = 0;
            while(_loc2_ < _loc1_)
            {
               _loc3_ = parent.getChildAt(_loc2_);
               if(_loc3_._group == this)
               {
                  _loc4_ = _loc4_ + _loc3_.width;
               }
               _loc2_++;
            }
            _loc2_ = 0;
            while(_loc2_ < _loc1_)
            {
               _loc3_ = parent.getChildAt(_loc2_);
               if(_loc3_._group == this)
               {
                  if(_loc4_ > 0)
                  {
                     _loc3_.sizePercent = _loc3_.width / _loc4_;
                  }
                  else
                  {
                     _loc3_.sizePercent = 0;
                  }
               }
               _loc2_++;
            }
         }
         else
         {
            _loc2_ = 0;
            while(_loc2_ < _loc1_)
            {
               _loc3_ = parent.getChildAt(_loc2_);
               if(_loc3_._group == this)
               {
                  _loc4_ = _loc4_ + _loc3_.height;
               }
               _loc2_++;
            }
            _loc2_ = 0;
            while(_loc2_ < _loc1_)
            {
               _loc3_ = parent.getChildAt(_loc2_);
               if(_loc3_._group == this)
               {
                  if(_loc4_ > 0)
                  {
                     _loc3_.sizePercent = _loc3_.height / _loc4_;
                  }
                  else
                  {
                     _loc3_.sizePercent = 0;
                  }
               }
               _loc2_++;
            }
         }
      }
      
      public function updateImmdediately(param1:Boolean = false) : void
      {
         var _loc3_:int = 0;
         var _loc4_:EGObject = null;
         var _loc9_:int = 0;
         this.needUpdate = false;
         if(parent == null)
         {
            return;
         }
         if(this._advanced)
         {
            this.handleLayout(param1);
         }
         var _loc2_:int = parent.numChildren;
         var _loc5_:int = int.MAX_VALUE;
         var _loc6_:int = int.MAX_VALUE;
         var _loc7_:int = int.MIN_VALUE;
         var _loc8_:int = int.MIN_VALUE;
         var _loc10_:int = 0;
         _loc3_ = 0;
         while(_loc3_ < _loc2_)
         {
            _loc4_ = parent.getChildAt(_loc3_);
            if(_loc4_._group == this)
            {
               _loc9_ = _loc4_.x;
               if(_loc9_ < _loc5_)
               {
                  _loc5_ = _loc9_;
               }
               _loc9_ = _loc4_.y;
               if(_loc9_ < _loc6_)
               {
                  _loc6_ = _loc9_;
               }
               _loc9_ = _loc4_.x + _loc4_.width;
               if(_loc9_ > _loc7_)
               {
                  _loc7_ = _loc9_;
               }
               _loc9_ = _loc4_.y + _loc4_.height;
               if(_loc9_ > _loc8_)
               {
                  _loc8_ = _loc9_;
               }
               _loc10_++;
            }
            _loc3_++;
         }
         this._empty = _loc10_ == 0;
         var _loc11_:Boolean = _settingManually;
         _settingManually = false;
         if(!this._empty)
         {
            this.updating = 1;
            setXY(_loc5_,_loc6_);
            this.updating = 2;
            setSize(_loc7_ - _loc5_,_loc8_ - _loc6_);
         }
         else
         {
            this.updating = 2;
            setSize(0,0);
         }
         this.updating = 0;
         _settingManually = _loc11_;
      }
      
      private function handleLayout(param1:Boolean) : void
      {
         var _loc3_:int = 0;
         var _loc4_:EGObject = null;
         var _loc5_:Number = NaN;
         var _loc6_:Number = NaN;
         var _loc2_:int = parent.numChildren;
         this.updating = this.updating | 1;
         if(this._layout == "hz")
         {
            _loc5_ = NaN;
            _loc3_ = 0;
            while(_loc3_ < _loc2_)
            {
               _loc4_ = parent.getChildAt(_loc3_);
               if(_loc4_._group == this)
               {
                  if(isNaN(_loc5_))
                  {
                     _loc5_ = int(_loc4_.x);
                  }
                  else if(param1)
                  {
                     _loc4_.setProperty("x",_loc5_);
                  }
                  else
                  {
                     _loc4_.x = _loc5_;
                  }
                  if(_loc4_.width != 0)
                  {
                     _loc5_ = _loc5_ + int(_loc4_.width + this._columnGap);
                  }
               }
               _loc3_++;
            }
            if(!this._percentReady)
            {
               this.updatePercent();
            }
         }
         else if(this._layout == "vt")
         {
            _loc6_ = NaN;
            _loc3_ = 0;
            while(_loc3_ < _loc2_)
            {
               _loc4_ = parent.getChildAt(_loc3_);
               if(_loc4_._group == this)
               {
                  if(isNaN(_loc6_))
                  {
                     _loc6_ = int(_loc4_.y);
                  }
                  else if(param1)
                  {
                     _loc4_.setProperty("y",_loc6_);
                  }
                  else
                  {
                     _loc4_.y = _loc6_;
                  }
                  if(_loc4_.height != 0)
                  {
                     _loc6_ = _loc6_ + int(_loc4_.height + this._lineGap);
                  }
               }
               _loc3_++;
            }
            if(!this._percentReady)
            {
               this.updatePercent();
            }
         }
         this.updating = this.updating & 2;
      }
      
      public function moveChildren(param1:Number, param2:Number) : void
      {
         var _loc4_:int = 0;
         var _loc5_:EGObject = null;
         if((this.updating & 1) != 0 || !parent)
         {
            return;
         }
         this.updating = this.updating | 1;
         var _loc3_:int = parent.numChildren;
         _loc4_ = 0;
         while(_loc4_ < _loc3_)
         {
            _loc5_ = parent.getChildAt(_loc4_);
            if(_loc5_._group == this)
            {
               _loc5_.setXY(_loc5_.x + param1,_loc5_.y + param2);
            }
            _loc4_++;
         }
         this.updating = this.updating & 2;
      }
      
      public function resizeChildren(param1:Number, param2:Number) : void
      {
         var _loc4_:int = 0;
         var _loc5_:int = 0;
         var _loc6_:EGObject = null;
         var _loc12_:Number = NaN;
         var _loc13_:Number = NaN;
         var _loc14_:Number = NaN;
         var _loc15_:Number = NaN;
         if((this.updating & 2) != 0 || !parent)
         {
            return;
         }
         var _loc3_:int = parent.numChildren;
         var _loc7_:int = 0;
         var _loc8_:int = -1;
         var _loc9_:Number = 0;
         var _loc10_:Number = 0;
         var _loc11_:Boolean = false;
         _loc4_ = 0;
         while(_loc4_ < _loc3_)
         {
            _loc6_ = parent.getChildAt(_loc4_);
            if(_loc6_._group == this)
            {
               _loc8_ = _loc4_;
               _loc7_++;
            }
            _loc4_++;
         }
         if(_loc7_ == 0)
         {
            return;
         }
         this.updating = this.updating | 2;
         if(this._layout == "hz")
         {
            if(!this._percentReady)
            {
               this.updatePercent();
            }
            _loc10_ = _loc9_ = this.width - (_loc7_ - 1) * this._columnGap;
            _loc12_ = NaN;
            _loc4_ = 0;
            while(_loc4_ < _loc3_)
            {
               _loc6_ = parent.getChildAt(_loc4_);
               if(_loc6_._group == this)
               {
                  if(isNaN(_loc12_))
                  {
                     _loc12_ = int(_loc6_.x);
                  }
                  else
                  {
                     _loc6_.x = _loc12_;
                  }
                  if(_loc8_ == _loc4_)
                  {
                     _loc13_ = _loc10_;
                  }
                  else
                  {
                     _loc13_ = Math.round(_loc6_.sizePercent * _loc9_);
                  }
                  _loc6_.setSize(_loc13_,_loc6_._rawHeight + param2,true,true);
                  _loc10_ = _loc10_ - _loc6_.width;
                  if(_loc8_ == _loc4_)
                  {
                     if(_loc10_ > 0)
                     {
                        _loc5_ = 0;
                        while(_loc5_ <= _loc4_)
                        {
                           _loc6_ = parent.getChildAt(_loc5_);
                           if(_loc6_._group == this)
                           {
                              if(!_loc11_)
                              {
                                 _loc13_ = _loc6_.width + _loc10_;
                                 if((_loc6_.maxWidth == 0 || _loc13_ < _loc6_.maxWidth) && (_loc6_.minWidth == 0 || _loc13_ > _loc6_.minWidth))
                                 {
                                    _loc6_.setSize(_loc13_,_loc6_.height,true,true);
                                    _loc11_ = true;
                                 }
                              }
                              else
                              {
                                 _loc6_.x = _loc6_.x + _loc10_;
                              }
                           }
                           _loc5_++;
                        }
                     }
                  }
                  else
                  {
                     _loc12_ = _loc12_ + (_loc6_.width + this._columnGap);
                  }
               }
               _loc4_++;
            }
         }
         else if(this._layout == "vt")
         {
            if(!this._percentReady)
            {
               this.updatePercent();
            }
            _loc10_ = _loc9_ = this.height - (_loc7_ - 1) * this._lineGap;
            _loc14_ = NaN;
            _loc4_ = 0;
            while(_loc4_ < _loc3_)
            {
               _loc6_ = parent.getChildAt(_loc4_);
               if(_loc6_._group == this)
               {
                  if(isNaN(_loc14_))
                  {
                     _loc14_ = int(_loc6_.y);
                  }
                  else
                  {
                     _loc6_.y = _loc14_;
                  }
                  if(_loc8_ == _loc4_)
                  {
                     _loc15_ = _loc10_;
                  }
                  else
                  {
                     _loc15_ = Math.round(_loc6_.sizePercent * _loc9_);
                  }
                  _loc6_.setSize(_loc6_._rawWidth + param1,_loc15_,true,true);
                  _loc10_ = _loc10_ - _loc6_.height;
                  if(_loc8_ == _loc4_)
                  {
                     if(_loc10_ > 0)
                     {
                        _loc5_ = 0;
                        while(_loc5_ <= _loc4_)
                        {
                           _loc6_ = parent.getChildAt(_loc5_);
                           if(_loc6_._group == this)
                           {
                              if(!_loc11_)
                              {
                                 _loc15_ = _loc6_.height + _loc10_;
                                 if((_loc6_.maxHeight == 0 || _loc15_ < _loc6_.maxHeight) && (_loc6_.minHeight == 0 || _loc15_ > _loc6_.minHeight))
                                 {
                                    _loc6_.setSize(_loc6_.width,_loc15_,true,true);
                                    _loc11_ = true;
                                 }
                              }
                              else
                              {
                                 _loc6_.y = _loc6_.y + _loc10_;
                              }
                           }
                           _loc5_++;
                        }
                     }
                  }
                  else
                  {
                     _loc14_ = _loc14_ + (_loc6_.height + this._lineGap);
                  }
               }
               _loc4_++;
            }
         }
         else
         {
            _loc4_ = 0;
            while(_loc4_ < _loc3_)
            {
               _loc6_ = parent.getChildAt(_loc4_);
               if(_loc6_._group == this)
               {
                  _loc6_.setSize(_loc6_._rawWidth + param1,_loc6_._rawHeight + param2,true,true);
               }
               _loc4_++;
            }
         }
         this.updating = this.updating & 1;
      }
      
      public function get empty() : Boolean
      {
         return this._empty;
      }
      
      override protected function updateAlpha() : void
      {
         var _loc2_:int = 0;
         var _loc3_:EGObject = null;
         super.updateAlpha();
         if(this.underConstruct)
         {
            return;
         }
         var _loc1_:int = parent.numChildren;
         _loc2_ = 0;
         while(_loc2_ < _loc1_)
         {
            _loc3_ = parent.getChildAt(_loc2_);
            if(_loc3_._group == this)
            {
               _loc3_.alpha = this.alpha;
            }
            _loc2_++;
         }
      }
      
      override public function handleControllerChanged(param1:EController) : void
      {
         if(this._advanced)
         {
            super.handleControllerChanged(param1);
         }
      }
      
      override public function fromXML_beforeAdd(param1:XML) : void
      {
         var _loc2_:String = null;
         super.fromXML_beforeAdd(param1);
         this._advanced = param1.@advanced == "true";
         this.displayCollapsed = param1.@collapsed == "true";
         if(this._advanced)
         {
            _loc2_ = param1.@layout;
            if(_loc2_)
            {
               this._layout = _loc2_;
            }
            _loc2_ = param1.@lineGap;
            if(_loc2_)
            {
               this._lineGap = parseInt(_loc2_);
            }
            else
            {
               this._lineGap = 0;
            }
            _loc2_ = param1.@colGap;
            if(_loc2_)
            {
               this._columnGap = parseInt(_loc2_);
            }
            else
            {
               this._columnGap = 0;
            }
         }
      }
      
      override public function toXML() : XML
      {
         var _loc1_:XML = super.toXML();
         if(this._advanced)
         {
            _loc1_.@advanced = "true";
         }
         if(this.displayCollapsed)
         {
            _loc1_.@collapsed = "true";
         }
         if(this._advanced && this._layout != "none")
         {
            _loc1_.@layout = this._layout;
            if(this._lineGap != 0)
            {
               _loc1_.@lineGap = this._lineGap;
            }
            if(this._columnGap != 0)
            {
               _loc1_.@colGap = this._columnGap;
            }
         }
         return _loc1_;
      }
   }
}
